package br.com.cefetrn.apoena.view.action;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import br.com.cefetrn.apoena.dominio.entity.AreasAtuacaoEntidadeFinanciadora;
import br.com.cefetrn.apoena.dominio.entity.AreasAtuacaoProfissional;
import br.com.cefetrn.apoena.dominio.entity.AreasAtuacaoPublicoAlvo;
import br.com.cefetrn.apoena.dominio.entity.AreasDeAtuacao;
import br.com.cefetrn.apoena.dominio.entity.Endereco;
import br.com.cefetrn.apoena.dominio.entity.EntidadeFinanciadora;
import br.com.cefetrn.apoena.dominio.entity.Profissional;
import br.com.cefetrn.apoena.dominio.home.Home4AreasAtuacaoEntidadeFinanciadora;
import br.com.cefetrn.apoena.dominio.home.Home4AreasAtuacaoPublicoAlvo;
import br.com.cefetrn.apoena.dominio.home.Home4AreasDeAtuacao;
import br.com.cefetrn.apoena.dominio.home.Home4EntidadeFinanciadora;
import br.com.cefetrn.apoena.dominio.home.Home4Pessoa;

public class Action4entidadeFinanciadora extends AxActionAPOENA {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private EntidadeFinanciadora entidadeFinanciadora = new EntidadeFinanciadora();
	
	private List<String> unidadesFederativas = Endereco.UNIDADES_FEDERATIVAS;

	//Lista de Entidades Financiadoras a serem exibidas na consulta
	private List<EntidadeFinanciadora> financiadoras = new ArrayList<EntidadeFinanciadora>();
	// Lista completa das opcoes disponiveis
	private List<AreasDeAtuacao> areas;
	// Lista contendo apenas opcoes selecionadas
	private List<AreasDeAtuacao> retorno;
	//Objeto para persistir na tabela area de atuacao entidade financiadora
	AreasAtuacaoEntidadeFinanciadora aaef;
	// lista dos objetos acima para facilitar persistencia
	private List<AreasAtuacaoEntidadeFinanciadora> aaefs = new ArrayList<AreasAtuacaoEntidadeFinanciadora>();

	//Homes
	Home4AreasDeAtuacao haa = new Home4AreasDeAtuacao();

	Home4EntidadeFinanciadora hef = new Home4EntidadeFinanciadora();

	Home4AreasAtuacaoEntidadeFinanciadora haaef = new Home4AreasAtuacaoEntidadeFinanciadora();

	Home4AreasDeAtuacao ha = new Home4AreasDeAtuacao();

	Home4Pessoa hp = new Home4Pessoa();

	Home4AreasAtuacaoPublicoAlvo homeAreasAtuacaoPublicoAlvo = new Home4AreasAtuacaoPublicoAlvo();

	// INPUT DO FORMULÁRIO
	private List<String> strAreas = new ArrayList<String>();

	private List<String> strAreasPublico = new ArrayList<String>();

	private int codAreaAtuacaoBuscada = new Integer(0);

	private static final Log LOG = LogFactory
			.getLog(Action4entidadeFinanciadora.class);

	public void prepare() throws Exception {
		LOG.info("Starting prepare()");

		haa.setSession(getSession());
		hef.setSession(getSession());
		haaef.setSession(getSession());
		ha.setSession(getSession());
		homeAreasAtuacaoPublicoAlvo.setSession(getSession());

		areas = ha.findAll();

	}

	@Override
	protected String go() {
		LOG.info("Starting go()");

		/*
		 * Popula o objeto da tabela area de atuacao entidade financiadora com a
		 * lista de retorno com apenas as opcoes marcadas
		 */
		if (retorno != null) {
			for (AreasDeAtuacao aa : retorno) {

				for (AreasAtuacaoPublicoAlvo aapa : aa
						.getAreasAtuacaoPublicoAlvos()) {

					aaef = new AreasAtuacaoEntidadeFinanciadora();
					aaef.setAreasDeAtuacao(aa);
					aaef.setEntidadeFinanciadora(entidadeFinanciadora);
					aaef.setPublicoAlvo(aapa.getPublicoAlvo());
					aaefs.add(aaef);
				}
			}
		}

		if (CADASTRO.equalsIgnoreCase(tipo))
			cadastrar();

		if (BUSCA.equalsIgnoreCase(tipo))
			financiadoras = buscar(codAreaAtuacaoBuscada, entidadeFinanciadora);

		if (REMOCAO.equalsIgnoreCase(tipo))
			deletar();
		if (EDICAO.equalsIgnoreCase(tipo))
			editar();

		return result;

	}

	private void editar() {
		// TODO Auto-generated method stub
		hef.setSession(getSession());
		hef.attachDirty(entidadeFinanciadora);

	}

	private void deletar() {
		// TODO Auto-generated method stub
		hef.setSession(getSession());
		hef.delete(entidadeFinanciadora);
	}

	private void cadastrar() {

		// Cadastra entidade financiadora
		if (botao.equalsIgnoreCase("enviar")) {
			entidadeFinanciadora.setLogin(criaLogin());
			loadAreasDeAtuacaoEntidadeFinanciadora();
			entidadeFinanciadora.getPessoaByIdContato().setLogin(criaLogin());
			hef.persist(entidadeFinanciadora);// Persiste entidade financiadora

			// Persiste areas de atuacao da entidade financiadora
			/*for (AreasAtuacaoEntidadeFinanciadora aaef : aaefs)
				haaef.persist(aaef);*/

			addActionMessage("CADASTRO REALIZADO COM SUCESSO!");

			result = SUCCESS;
		}

	}

	private List<EntidadeFinanciadora> buscar(int cod, EntidadeFinanciadora ef) {
		AreasDeAtuacao a = null;
		if (botao.equalsIgnoreCase("buscar")) {
			if (codAreaAtuacaoBuscada != 0) {
				a = haa.findById(codAreaAtuacaoBuscada);
			}
			return hef
					.findEntidadesFinanciadoras(a, ef.getEndereco().getPais());
		} else {
			return null;
		}
	}

	public EntidadeFinanciadora getEntidadeFinanciadora() {
		return entidadeFinanciadora;
	}

	public void setEntidadeFinanciadora(
			EntidadeFinanciadora entidadeFinanciadora) {
		this.entidadeFinanciadora = entidadeFinanciadora;
	}

	public List<AreasDeAtuacao> getAreas() {
		return areas;
	}

	public void setAreas(List<AreasDeAtuacao> areas) {
		this.areas = areas;
	}

	public List<AreasDeAtuacao> getRetorno() {
		return retorno;
	}

	public void setRetorno(List<AreasDeAtuacao> retorno) {
		this.retorno = retorno;
	}

	public AreasAtuacaoEntidadeFinanciadora getAaef() {
		return aaef;
	}

	public void setAaef(AreasAtuacaoEntidadeFinanciadora aaef) {
		this.aaef = aaef;
	}

	public List<AreasAtuacaoEntidadeFinanciadora> getAaefs() {
		return aaefs;
	}

	public void setAaefs(List<AreasAtuacaoEntidadeFinanciadora> aaefs) {
		this.aaefs = aaefs;
	}

	public int getCodAreaAtuacaoBuscada() {
		return codAreaAtuacaoBuscada;
	}

	public void setCodAreaAtuacaoBuscada(int codAreaAtuacaoBuscada) {
		this.codAreaAtuacaoBuscada = codAreaAtuacaoBuscada;
	}

	public List<EntidadeFinanciadora> getFinanciadoras() {
		return financiadoras;
	}

	public void setFinanciadoras(List<EntidadeFinanciadora> financiadoras) {
		this.financiadoras = financiadoras;
	}

	public List<String> getStrAreas() {
		return strAreas;
	}

	public void setStrAreas(List<String> strAreas) {
		this.strAreas = strAreas;
	}

	public List<String> getStrAreasPublico() {
		return strAreasPublico;
	}

	public void setStrAreasPublico(List<String> strAreasPublico) {
		this.strAreasPublico = strAreasPublico;
	}

	private void loadAreasDeAtuacaoEntidadeFinanciadora() {

		Set<AreasAtuacaoEntidadeFinanciadora> areas = new HashSet<AreasAtuacaoEntidadeFinanciadora>();

		for (AreasAtuacaoPublicoAlvo areaPublico : loadAreasAtuacaoPublicoAlvo())
			areas.add(new AreasAtuacaoEntidadeFinanciadora(
					entidadeFinanciadora, areaPublico.getAreasDeAtuacao(),
					areaPublico.getPublicoAlvo()));

		entidadeFinanciadora.setAreasAtuacaoEntidadeFinanciadoras(areas);

	}

	private List<AreasAtuacaoPublicoAlvo> loadAreasAtuacaoPublicoAlvo() {

		List<AreasAtuacaoPublicoAlvo> areasPublico = new ArrayList<AreasAtuacaoPublicoAlvo>();

		if (strAreasPublico != null && !strAreasPublico.isEmpty()) {

			for (String id : strAreasPublico) {
				areasPublico.add(homeAreasAtuacaoPublicoAlvo
						.findById(new Integer(id)));
			}

		}

		return areasPublico;
	}

	public List<String> getUnidadesFederativas() {
		return unidadesFederativas;
	}

	public void setUnidadesFederativas(List<String> unidadesFederativas) {
		this.unidadesFederativas = unidadesFederativas;
	}
	
	
}
